#!/bin/bash

# DuckDB-CJ 文档构建脚本
# 用于生成和部署文档

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 显示帮助信息
show_help() {
    cat << EOF
DuckDB-CJ 文档构建工具

用法: $0 [选项] [命令]

命令:
  build       构建文档
  serve       启动本地服务器
  deploy      部署到 GitHub Pages
  clean       清理构建文件
  check       检查文档完整性
  stats       显示文档统计信息

选项:
  -h, --help     显示此帮助信息
  -v, --verbose  详细输出
  -q, --quiet    静默模式
  --port PORT    指定服务器端口 (默认: 4000)
  --host HOST    指定服务器主机 (默认: localhost)

示例:
  $0 build                # 构建文档
  $0 serve --port 8080    # 在端口 8080 启动服务器
  $0 deploy               # 部署到 GitHub Pages
  $0 check                # 检查文档完整性

EOF
}

# 检查依赖
check_dependencies() {
    log_info "检查依赖..."
    
    # 检查 Ruby 和 Jekyll
    if ! command -v ruby &> /dev/null; then
        log_error "Ruby 未安装，请先安装 Ruby"
        exit 1
    fi
    
    if ! command -v bundle &> /dev/null; then
        log_error "Bundler 未安装，请运行: gem install bundler"
        exit 1
    fi
    
    # 检查 Node.js (用于某些工具)
    if ! command -v node &> /dev/null; then
        log_warning "Node.js 未安装，某些功能可能不可用"
    fi
    
    log_success "依赖检查完成"
}

# 安装依赖
install_dependencies() {
    log_info "安装文档依赖..."
    
    # 创建 Gemfile 如果不存在
    if [ ! -f "Gemfile" ]; then
        cat > Gemfile << EOF
source "https://rubygems.org"

gem "jekyll", "~> 4.3"
gem "jekyll-feed"
gem "jekyll-sitemap"
gem "jekyll-seo-tag"
gem "minima"
gem "kramdown-parser-gfm"

group :jekyll_plugins do
  gem "jekyll-feed"
  gem "jekyll-sitemap"
  gem "jekyll-seo-tag"
end
EOF
    fi
    
    bundle install
    log_success "依赖安装完成"
}

# 构建文档
build_docs() {
    log_info "构建文档..."
    
    # 清理旧的构建文件
    rm -rf _site
    
    # 生成 API 文档
    generate_api_docs
    
    # 生成统计信息
    generate_stats
    
    # 构建 Jekyll 站点
    bundle exec jekyll build
    
    log_success "文档构建完成"
}

# 生成 API 文档
generate_api_docs() {
    log_info "生成 API 文档..."
    
    # 这里可以添加自动生成 API 文档的逻辑
    # 例如从源代码注释生成文档
    
    log_success "API 文档生成完成"
}

# 生成统计信息
generate_stats() {
    log_info "生成文档统计信息..."
    
    # 统计文档数量
    total_docs=$(find . -name "*.md" | wc -l)
    
    # 统计字数
    total_words=$(find . -name "*.md" -exec wc -w {} + | tail -1 | awk '{print $1}')
    
    # 统计代码示例
    code_examples=$(grep -r "```cangjie" . | wc -l)
    
    # 生成统计文件
    cat > _data/stats.yml << EOF
total_docs: $total_docs
total_words: $total_words
code_examples: $code_examples
last_updated: "$(date -u +"%Y-%m-%d %H:%M:%S UTC")"
EOF
    
    log_success "统计信息生成完成"
}

# 启动本地服务器
serve_docs() {
    local port=${1:-4000}
    local host=${2:-localhost}
    
    log_info "启动文档服务器 (http://$host:$port)..."
    
    bundle exec jekyll serve --host $host --port $port --livereload
}

# 部署到 GitHub Pages
deploy_docs() {
    log_info "部署文档到 GitHub Pages..."
    
    # 检查是否在 git 仓库中
    if [ ! -d ".git" ]; then
        log_error "不在 Git 仓库中，无法部署"
        exit 1
    fi
    
    # 检查是否有未提交的更改
    if [ -n "$(git status --porcelain)" ]; then
        log_warning "有未提交的更改，建议先提交"
        read -p "是否继续部署? (y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            log_info "部署已取消"
            exit 0
        fi
    fi
    
    # 构建文档
    build_docs
    
    # 部署到 gh-pages 分支
    if command -v ghp-import &> /dev/null; then
        ghp-import -n -p -f _site
        log_success "文档已部署到 GitHub Pages"
    else
        log_error "ghp-import 未安装，请运行: pip install ghp-import"
        exit 1
    fi
}

# 清理构建文件
clean_docs() {
    log_info "清理构建文件..."
    
    rm -rf _site
    rm -rf .jekyll-cache
    rm -rf .sass-cache
    rm -f _data/stats.yml
    
    log_success "清理完成"
}

# 检查文档完整性
check_docs() {
    log_info "检查文档完整性..."
    
    local errors=0
    
    # 检查链接
    log_info "检查内部链接..."
    while IFS= read -r -d '' file; do
        while IFS= read -r line; do
            if [[ $line =~ \[.*\]\(([^)]+)\) ]]; then
                link="${BASH_REMATCH[1]}"
                if [[ $link =~ ^[^#]*\.md(#.*)?$ ]]; then
                    # 内部 Markdown 链接
                    target_file="${link%#*}"
                    if [[ ! $target_file =~ ^https?:// ]] && [[ ! -f "$target_file" ]]; then
                        log_error "断开的链接: $file -> $link"
                        ((errors++))
                    fi
                fi
            fi
        done < "$file"
    done < <(find . -name "*.md" -print0)
    
    # 检查图片
    log_info "检查图片链接..."
    while IFS= read -r -d '' file; do
        while IFS= read -r line; do
            if [[ $line =~ !\[.*\]\(([^)]+)\) ]]; then
                image="${BASH_REMATCH[1]}"
                if [[ ! $image =~ ^https?:// ]] && [[ ! -f "$image" ]]; then
                    log_error "缺失的图片: $file -> $image"
                    ((errors++))
                fi
            fi
        done < "$file"
    done < <(find . -name "*.md" -print0)
    
    # 检查必需文件
    log_info "检查必需文件..."
    required_files=(
        "index.md"
        "README.md"
        "SUMMARY.md"
        "_config.yml"
        "getting-started/installation.md"
        "getting-started/quickstart.md"
        "api/README.md"
        "api/core.md"
    )
    
    for file in "${required_files[@]}"; do
        if [[ ! -f "$file" ]]; then
            log_error "缺失必需文件: $file"
            ((errors++))
        fi
    done
    
    if [ $errors -eq 0 ]; then
        log_success "文档完整性检查通过"
    else
        log_error "发现 $errors 个问题"
        exit 1
    fi
}

# 显示文档统计信息
show_stats() {
    log_info "文档统计信息:"
    
    echo
    echo "📊 基本统计:"
    echo "  文档总数: $(find . -name "*.md" | wc -l)"
    echo "  总字数: $(find . -name "*.md" -exec wc -w {} + | tail -1 | awk '{print $1}')"
    echo "  代码示例: $(grep -r "```cangjie" . | wc -l)"
    
    echo
    echo "📁 目录结构:"
    tree -d -L 2 . 2>/dev/null || find . -type d -maxdepth 2 | sort
    
    echo
    echo "📈 文件分布:"
    for dir in */; do
        if [[ -d "$dir" ]]; then
            count=$(find "$dir" -name "*.md" | wc -l)
            echo "  $dir: $count 个文件"
        fi
    done
}

# 主函数
main() {
    local command=""
    local verbose=false
    local quiet=false
    local port=4000
    local host="localhost"
    
    # 解析参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -v|--verbose)
                verbose=true
                shift
                ;;
            -q|--quiet)
                quiet=true
                shift
                ;;
            --port)
                port="$2"
                shift 2
                ;;
            --host)
                host="$2"
                shift 2
                ;;
            build|serve|deploy|clean|check|stats)
                command="$1"
                shift
                ;;
            *)
                log_error "未知参数: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    # 如果没有指定命令，显示帮助
    if [[ -z "$command" ]]; then
        show_help
        exit 0
    fi
    
    # 切换到文档目录
    cd "$(dirname "$0")"
    
    # 执行命令
    case $command in
        build)
            check_dependencies
            install_dependencies
            build_docs
            ;;
        serve)
            check_dependencies
            install_dependencies
            serve_docs "$port" "$host"
            ;;
        deploy)
            check_dependencies
            install_dependencies
            deploy_docs
            ;;
        clean)
            clean_docs
            ;;
        check)
            check_docs
            ;;
        stats)
            show_stats
            ;;
    esac
}

# 运行主函数
main "$@"
